/**
 * ComposeMiddleware 示例测试文件
 * 演示如何在实际场景中使用组合中间件
 */

const {
    createProductWithMiddleware,
    getProductListWithAuth,
    adminProductHandler,
    updateProductWithComplexMiddleware,
    deleteProductWithErrorHandling,
    demonstrateComposeMiddleware
} = require('./example/compose_example');

/**
 * 测试场景1：商品管理流程
 */
async function testProductManagement() {
    console.log('=== 商品管理流程测试 ===\n');
    
    // 模拟用户上下文
    const userContext = {
        params: {
            productId: 'prod_001',
            productName: '测试商品',
            price: 99.99
        },
        uniIdToken: 'user_token_123',
        result: null
    };
    
    // 模拟管理员上下文
    const adminContext = {
        ...userContext,
        uniIdToken: 'admin_token_456'
    };
    
    console.log('1. 普通用户创建商品（需要登录）:');
    try {
        const result = await createProductWithMiddleware.call(userContext);
        console.log('创建结果:', result);
    } catch (error) {
        console.log('创建失败:', error.message);
    }
    
    console.log('\n2. 获取商品列表（需要登录）:');
    try {
        const result = await getProductListWithAuth.call(userContext);
        console.log('获取结果:', result);
    } catch (error) {
        console.log('获取失败:', error.message);
    }
    
    console.log('\n3. 管理员创建商品（需要管理员权限）:');
    try {
        const result = await adminProductHandler.call(adminContext);
        console.log('管理员创建结果:', result);
    } catch (error) {
        console.log('管理员创建失败:', error.message);
    }
    
    console.log('\n4. 更新商品信息（复杂中间件组合）:');
    try {
        const result = await updateProductWithComplexMiddleware.call(adminContext);
        console.log('更新结果:', result);
    } catch (error) {
        console.log('更新失败:', error.message);
    }
}

/**
 * 测试场景2：错误处理测试
 */
async function testErrorHandling() {
    console.log('\n=== 错误处理测试 ===\n');
    
    const context = {
        params: {
            productId: 'prod_error'
        },
        uniIdToken: 'user_token_123'
    };
    
    console.log('测试错误处理中间件（可能抛出异常）:');
    for (let i = 0; i < 3; i++) {
        try {
            const result = await deleteProductWithErrorHandling.call(context);
            console.log(`第${i + 1}次执行结果:`, result);
        } catch (error) {
            console.log(`第${i + 1}次执行错误:`, error.message);
        }
    }
}

/**
 * 测试场景3：参数验证测试
 */
async function testValidation() {
    console.log('\n=== 参数验证测试 ===\n');
    
    // 缺少必需参数的上下文
    const invalidContext = {
        params: {
            // 缺少 productId 和 productName
            price: 100
        },
        uniIdToken: 'user_token_123'
    };
    
    console.log('测试参数验证中间件（缺少必需参数）:');
    try {
        const result = await createProductWithMiddleware.call(invalidContext);
        console.log('验证结果:', result);
    } catch (error) {
        console.log('验证错误:', error.message);
    }
}

/**
 * 测试场景4：权限控制测试
 */
async function testPermissionControl() {
    console.log('\n=== 权限控制测试 ===\n');
    
    // 普通用户尝试管理员操作
    const userContext = {
        params: {
            productId: 'prod_002',
            productName: '用户尝试创建的商品'
        },
        uniIdToken: 'user_token_123'  // 普通用户token
    };
    
    console.log('普通用户尝试管理员操作:');
    try {
        const result = await adminProductHandler.call(userContext);
        console.log('权限控制结果:', result);
    } catch (error) {
        console.log('权限控制错误:', error.message);
    }
}

/**
 * 运行所有测试
 */
async function runAllTests() {
    console.log('开始运行 ComposeMiddleware 测试...\n');
    
    await testProductManagement();
    await testErrorHandling();
    await testValidation();
    await testPermissionControl();
    
    console.log('\n=== 运行完整示例演示 ===');
    await demonstrateComposeMiddleware();
    
    console.log('\n=== 所有测试完成 ===');
}

// 如果直接运行此文件，则执行测试
if (require.main === module) {
    runAllTests().catch(console.error);
}

module.exports = {
    testProductManagement,
    testErrorHandling,
    testValidation,
    testPermissionControl,
    runAllTests
};